package main

import "fmt"

func printArray(arr [5]int) {
	for i, v := range arr {
		fmt.Println(i, v)
	}
	// 为了证明数组是值传递，我们在这里将数组的值进行改变
	arr[0] = 100
}

func main() {
	var arr1 [5]int
	arr2 := [3]int{1, 3, 5}
	arr3 := [...]int{2, 4, 6, 8, 10}
	var grid [4][5]int
	fmt.Println(arr1, arr2, arr3)
	fmt.Println(grid)

	// 循环数组的第一种方法
	for i := 0; i < len(arr3); i++ {
		fmt.Println(arr3[i])
	}

	// 循环数组的第二种方式使用range关键字
	for i, v := range arr3 {
		//fmt.Println(arr3[i])
		// 可以使用range同时获取下标和值
		fmt.Println(i, v)
	}

	// 根据上述案例，只想获取值不行要索引怎么实现
	for _, v := range arr3 {
		fmt.Println(v)
	}

	// 在上述案例中可以学到使用_来省略变量   这种方式不仅在range中可以使用，在其它地方也可以使用

	// 详解数组是值引用
	printArray(arr1)
	printArray(arr3)
	/**
	这里使用arr2会报以下的错误，因为函数需要的是type [5]int
	*/
	// cannot use arr2 (type [3]int) as type [5]int in argument to printArray
	//printArray(arr2)

	// 打印改变了数组值后的数据,根据返回结果可以得知是没有改变的
	// [0 0 0 0 0] [2 4 6 8 10]
	fmt.Println(arr1, arr3)

	/**
	总结：
	[10]int 和 [20]int是不同的类型
	调用func f(arr [5]int)会拷贝数组
	在go语言中一般不直接使用数组，而是使用的切片
	*/
}
